#include "u.h"
#include <QtEndian>
#include <QCryptographicHash>
U::U()
{}

QString U::getThDt(){
    return QString("%1\t%2").arg(reinterpret_cast<uintptr_t>(QThread::currentThreadId()), 0, 16).arg(QDateTime::currentDateTime().toString("yyMMdd hhmmss.zzz"));
}

uint16_t U::getCRC(const QVector<uint8_t> &data)
{
    uint16_t crc = 0xFFFF; // 初始化CRC寄存器为0xFFFF

    for (uint8_t byte : data)
    {
        crc ^= byte; // 与当前字节异或

        // 进行8次移位操作
        for (int i = 0; i < 8; ++i)
        {
            if (crc & 0x0001) // 检查最低位是否为1
            {
                crc >>= 1;     // 右移一位
                crc ^= 0xA001; // 与生成多项式异或
            }
            else
            {
                crc >>= 1;     // 最低位为0，仅右移
            }
        }
    }

    // 高低字节互换，返回16位CRC值
    return ((crc & 0x00FF) << 8) | ((crc & 0xFF00) >> 8);
}

QByteArray U::hexStringToByteArray(const QString &hexString)
{
    QByteArray byteArray;
    QString processed = hexString;

    // 移除所有空格和"0x"前缀
    processed.remove(' ');
    processed.remove("0x", Qt::CaseInsensitive);

    // 检查字符串长度是否为偶数（每字节需要2个十六进制字符）
    if (processed.length() % 2 != 0) {
        qWarning() << "Invalid hex string length (must be even)";
        return byteArray;
    }

    // 逐字节转换
    for (int i = 0; i < processed.length(); i += 2) {
        bool ok = false;
        // 截取2个字符并转换为16进制数值
        quint8 byte = processed.mid(i, 2).toUInt(&ok, 16);
        if (ok) {
            byteArray.append(byte);
        } else {
            qWarning() << "Invalid hex character at position" << i;
            return QByteArray(); // 遇到无效字符，返回空
        }
    }

    return byteArray;
}

QString U::byteArrayToHexString(const QByteArray &byteArray, bool uppercase, bool addSpace, bool addPrefix)
{
    // 使用QByteArray内置的toHex()方法转换为十六进制
    QByteArray hexBytes = byteArray.toHex();
    QString hexStr = QString(hexBytes);

    // 转换为大写
    if (uppercase) {
        hexStr = hexStr.toUpper();
    }

    // 添加空格分隔（每两个字符加一个空格）
    if (addSpace) {
        for (int i = 2; i < hexStr.length(); i += 3) {
            hexStr.insert(i, ' ');
        }
    }

    // 添加0x前缀
    if (addPrefix) {
        if (addSpace) {
            // 对每个字节添加0x前缀
            QStringList parts = hexStr.split(' ');
            for (int i = 0; i < parts.size(); ++i) {
                if (!parts[i].isEmpty()) {
                    parts[i] = "0x" + parts[i];
                }
            }
            hexStr = parts.join(' ');
        } else {
            // 整体添加0x前缀
            hexStr = "0x" + hexStr;
        }
    }

    return hexStr;
}

float U::hexToFloat(const QByteArray &hexData, bool isLittleEndian)
{
    qDebug() << "hexData:" <<  hexData.toHex();
    if (hexData.size() != 4) {
        qWarning() << "输入必须是4字节数据";
        return 0.0f;
    }

    // 将字节数据转换为32位无符号整数
    uint32_t uintValue;
    std::memcpy(&uintValue, hexData.data(), 4);

    // 处理字节序 - Qt6中QDataStream的字节序处理更明确
    if (isLittleEndian) {
        // 转换为小端字节序
        uintValue = qFromBigEndian<uint32_t>(uintValue);
    }

    // 强制转换为float（通过内存映射，遵循IEEE 754标准）
    float floatValue;
    std::memcpy(&floatValue, &uintValue, 4);

    return floatValue;
}

QString U::getCurrentDateStd()
{
    QDate currentDate = QDate::currentDate();
    return currentDate.toString(Qt::ISODate);
}

QString U::getCompileDate()
{
    const char* rawDate = __DATE__;
    QString dateStr = QString::fromLatin1(rawDate);
    qDebug() << "date:" << __DATE__;
    // 分割为三部分：月份缩写、日期、年份
    QStringList parts = dateStr.split(' ', Qt::SkipEmptyParts);
    if (parts.size() != 3) {
        qWarning() << "日期格式解析失败：" << dateStr;
        return "";
    }

    // 月份缩写映射表（英文缩写到数字）
    static const QMap<QString, QString> monthMap = {
        {"Jan", "01"}, {"Feb", "02"}, {"Mar", "03"}, {"Apr", "04"},
        {"May", "05"}, {"Jun", "06"}, {"Jul", "07"}, {"Aug", "08"},
        {"Sep", "09"}, {"Oct", "10"}, {"Nov", "11"}, {"Dec", "12"}
    };

    // 获取各部分并处理
    QString month = monthMap.value(parts[0]);
    QString day = parts[1].rightJustified(2, '0'); // 单数字日期补零（如"3"→"03"）
    QString year = parts[2];

    if (month.isEmpty()) {
        qWarning() << "无效的月份：" << parts[0];
        return "";
    }

    // 组合为YYYY-MM-DD格式
    return QString("%1-%2-%3").arg(year).arg(month).arg(day);
}

QString U::getMD5(const QString &input)
{
    QCryptographicHash hash(QCryptographicHash::Md5);

    // 添加需要计算哈希的数据
    hash.addData(input.toUtf8());

    // 计算并返回16进制字符串
    return hash.result().toHex();
}

bool U::validateDateStr(const QString &dateStr){
    // 1. 检查长度是否为6位
    if (dateStr.length() != 6) {
        qDebug() << "错误：日期字符串长度不是6位";
        return false;
    }

    // 2. 检查是否为纯数字
    bool isNumber;
    dateStr.toInt(&isNumber);
    if (!isNumber) {
        qDebug() << "错误：日期字符串包含非数字字符";
        return false;
    }

    // 3. 拆分年、月、日
    int yearPart = dateStr.mid(0, 2).toInt();
    int month = dateStr.mid(2, 2).toInt();
    int day = dateStr.mid(4, 2).toInt();

    // 4. 验证年、月、日范围
    if (month < 1 || month > 12) {
        qDebug() << "错误：月份无效（" << month << "）";
        return false;
    }

    if (day < 1 || day > 31) {
        qDebug() << "错误：日期无效（" << day << "）";
        return false;
    }

    // 5. 确定完整年份（这里假设为2000-2099年）
    int fullYear = 2000 + yearPart;

    // 6. 使用QDate验证日期有效性（考虑每月天数差异）
    QDate date(fullYear, month, day);
    if (!date.isValid()) {
        qDebug() << "错误：无效的日期（" << fullYear << "-" << month << "-" << day << "）";
        return false;
    }

    return true;
}


QString U::getDateStrFromStr(const QString &dateStr) {

    do{
        // 1. 检查长度是否为6位
        if (dateStr.length() != 6) {
            qDebug() << "错误：日期字符串长度不是6位";
            break;
        }

        // 2. 检查是否为纯数字
        bool isNumber;
        dateStr.toInt(&isNumber);
        if (!isNumber) {
            qDebug() << "错误：日期字符串包含非数字字符";
            break;
        }

        // 3. 拆分年、月、日
        int yearPart = dateStr.mid(0, 2).toInt();
        int month = dateStr.mid(2, 2).toInt();
        int day = dateStr.mid(4, 2).toInt();

        // 4. 验证年、月、日范围
        if (month < 1 || month > 12) {
            qDebug() << "错误：月份无效（" << month << "）";
            break;
        }

        if (day < 1 || day > 31) {
            qDebug() << "错误：日期无效（" << day << "）";
            break;
        }

        // 5. 确定完整年份（这里假设为2000-2099年）
        int fullYear = 2000 + yearPart;

        // 6. 使用QDate验证日期有效性（考虑每月天数差异）
        QDate date(fullYear, month, day);
        if (!date.isValid()) {
            qDebug() << "错误：无效的日期（" << fullYear << "-" << month << "-" << day << "）";
            break;
        }else{
            return date.toString(Qt::ISODate);
        }
    }while(0);
    QDate dt;
    return dt.toString(Qt::ISODate);
}

QString U::reverseString(const QString &str)
{
    QString reversed = str;
    std::reverse(reversed.begin(), reversed.end());
    qDebug() <<"reversStr:" << str << "->" <<reversed;
    return reversed;
}

QString U::getDateTimeSTD()
{
    return QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
}
